\documentclass{article}
\usepackage{ctex}
\usepackage{geometry}
\usepackage{ragged2e}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
  basicstyle=\ttfamily\small,    % 等宽字体
  numbers=left,                   % 显示行号
  numberstyle=\tiny\color{gray},  % 行号样式
  frame=single,                   % 边框样式
  breaklines=true,                % 自动换行
  keywordstyle=\color{blue},      % 关键字颜色
  commentstyle=\color{green!40!black}, % 注释颜色
  stringstyle=\color{red}         % 字符串颜色
}
\geometry{a4paper,scale=0.7}
\title{PWM与电机实验报告}
\author{赵俊宇 PB24061271}
\date{2025.4.19}

\begin{document}
\maketitle
\tableofcontents
\section{PWM的应用}
由于计数器的比较输出不占用CPU时间,先前我们在给小键盘发送扫描码和数码管编程时,数码管显示的重复现象就可以不再需要延时以避免.
这也代表着,我们的MCU可以借由此实现简单的双任务处理.

利用计数溢出,我们可以控制LED亮灭,核心代码如下:
\begin{lstlisting}[language=C]
    ISR(TIMER1_OVF_vect){
	ui_cnt++;
	if(ui_cnt>249) ui_cnt=0;
	if(ui_cnt<125){
		OCR1A=0;
		OCR1B+=4;
	}
	else {
		OCR1A=500;
		OCR1B-=4;
	}
}
\end{lstlisting}
    不仅LED如此,所有需要有规律的定时运行的代码都可以通过此种设置运行,比如先前对小键盘发出扫描码.
\section{步进电机头文件改进}
    步进电机有着不同的驱动方式,理应需要不同的延时时长.
\begin{lstlisting}[language=C]
    if(phase==0) _delay_us(900);//8拍 
    else if(phase==1) _delay_us(1600);//双4拍//
    else _delay_us(2000);//单4拍
\end{lstlisting}
通过一个简单的判断,就可以支持不同的驱动方式.
\section{中断控制直流电机}
    通过触摸开关计数改变比较值,可以借由此改变转速.还可以外接LCD,以实现计数可视化.
    可以概括为如下步骤:
\begin{enumerate}
    \item 设置io为输出
    \item 设置TOP值
    \item 设置比较值
    \item 设置匹配时清零或是置位
    \item 设置PWM模式和时钟预分频
    \item 设置溢出中断
    \item 设置全局中断
\end{enumerate}
    但是,较长时间后,驱动芯片的发热十分夸张.
\end{document}